package ar.com.wholeconsulting.pacc.model;

import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;

import javax.persistence.CascadeType;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.JoinTable;
import javax.persistence.ManyToOne;
import javax.persistence.NamedQueries;
import javax.persistence.NamedQuery;
import javax.persistence.OneToMany;
import javax.persistence.Table;

/**
 * @version 1.0 @created 06-Dic-2011 21:12:32
 */
@Entity
@Table(name = "MODELOS")
@NamedQueries({
    @NamedQuery(name = "Modelo.findByNombre", query = "from Modelo a WHERE a.nombre = :nombre"),
     @NamedQuery(name = "Modelo.findByID", query = "from Modelo a WHERE a.id = ?0"),
    @NamedQuery(name = "Modelo.findAll", query = "FROM Modelo a")})
public class Modelo implements Serializable {

    /**
     *
     */
    private static final long serialVersionUID = 1707611414403523228L;
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    @Column(name = "MODELO_ID")
    private Long id;
//    @OneToMany(cascade = CascadeType.ALL)
//    @JoinTable(name = "ModeloElemento", joinColumns = {
//        @JoinColumn(name = "MODELO_ID", unique = true)}, inverseJoinColumns = {
//        @JoinColumn(name = "ELEMENTO_ID")})
    @OneToMany(cascade = CascadeType.ALL, orphanRemoval = true)
    @JoinTable(name = "ModeloElemento", joinColumns =
    @JoinColumn(name = "MODELO_ID"), inverseJoinColumns =
    @JoinColumn(name = "ELEMENTO_ID"))
    private List<Elemento> elementos = new ArrayList<Elemento>();
    @Column(name = "NOMBRE", unique = true, nullable = false)
    private String nombre;
    @ManyToOne
    @JoinColumn(name = "FLUIDO_ID")
    private Fluido fluido;
    private Double presionMaxima;
    private Double temperaturaMaxima;
    private String codigo;
    private Double capacidadNominal;
    private String descripcion;
    @ManyToOne
    @JoinColumn(name = "FABRICANTE_ID", nullable = false)
    private Fabricante fabricante;

    public Modelo() {
    }

    public long calcularVolumen() {
        long volumen = 0;
        for (Elemento ele : this.elementos) {
            volumen += ele.getVolumen();
        }
        return volumen;
    }

    public long calcularDesarrollo() {
        long desarrollo = 0;
        for (Elemento ele : this.elementos) {
            desarrollo += ele.getDesarrollo();
        }
        return desarrollo;
    }

    public long calcularPeso() {
        long peso = 0;
        for (Elemento ele : this.elementos) {
            peso += ele.getVolumen();
        }
        return peso;
    }

    public List<Elemento> getElementos() {
        return this.elementos;
    }

    public void setElementos(List<Elemento> elementos) {
        this.elementos = elementos;
    }

    public Long getId() {
        return this.id;
    }

    public void setId(Long id) {
        this.id = id;
    }

    public String getNombre() {
        return this.nombre;
    }

    public void setNombre(String nombre) {
        this.nombre = nombre;
    }

    public Fabricante getFabricante() {
        return this.fabricante;
    }

    public void setFabricante(Fabricante fabricante) {
        this.fabricante = fabricante;
    }

    public Double getPresionMaxima() {
        return this.presionMaxima;
    }

    public void setPresionMaxima(Double PresionMaxima) {
        this.presionMaxima = PresionMaxima;
    }

    public Double getCapacidadNominal() {
        return this.capacidadNominal;
    }

    public void setCapacidadNominal(Double capacidadNominal) {
        this.capacidadNominal = capacidadNominal;
    }

    public String getCodigo() {
        return this.codigo;
    }

    public void setCodigo(String codigo) {
        this.codigo = codigo;
    }

    public Double getTemperaturaMaxima() {
        return temperaturaMaxima;
    }

    public void setTemperaturaMaxima(Double TemperaturaMaxima) {
        this.temperaturaMaxima = TemperaturaMaxima;
    }

    public Fluido getFluido() {
        return fluido;
    }

    public void setFluido(Fluido fluido) {
        this.fluido = fluido;
    }

    public String getDescripcion() {
        return this.descripcion;
    }

    public void setDescripcion(String descripcion) {
        this.descripcion = descripcion;
    }
    static public String FIND_BY_NOMBRE = "Modelo.findByNombre";
    static public String FIND_BY_ID = "Modelo.findByID";
    static public String FIND_ALL = "Modelo.findAll";
}
